package chapter01_Arr

import scala.collection.mutable.ArrayBuffer

/**
 * Created with IntelliJ IDEA.
 * ClassName: Test02_ArrayBuffer
 * Package: chapter01_Arr
 * Description:
 * User: fzykd
 *
 * @Author: LQH
 *          Date: 2023-07-12
 *          Time: 21:53
 */

//可变数组
object Test02_ArrayBuffer {

  def main(args: Array[String]): Unit = {
    //创建可变数组 不给值  默认值大小16
    val arr2: ArrayBuffer[Int] = new ArrayBuffer[Int]()

    //创建可变数组伴生对象创建可变数组
    val arr1 = ArrayBuffer[Int](3, 2, 5)
    //ArrayBuffer 需要引入scala.collection.mutable.ArrayBuffer

    println(arr1.mkString(","))//3,2,5
    println(arr1) //直接打印 ArrayBuffer(3, 2, 5)
    //但是不可变数组Array不能直接输出 输出是引用地址

    //遍历数组
    //for循环普通遍历
    println("---for普通遍历---")
    for (i <- 0 until arr1.length) {
      println(i)
    }

    //indices 等价 0 until arr1.length
    for (i <- arr2.indices) {
      println(i)
    }
    println("----for增强----")
    //for增强 参数遍历符号 数组
    for (elem <- arr1) {
      println(elem)
    }

    println("----foreach循环----")
    //foreach循环 lambda 表达式
    arr1.foreach((elem: Int) => println(elem))
    arr1.foreach(println)


    println("----迭代器遍历----")
    //迭代器遍历
    val iterator = arr1.iterator
    while (iterator.hasNext) {
      println(iterator.next())
    }

    //添加元素 末尾追加
    //运算符添加 也是生成新的数组
    val newArr1 = arr1 :+ 15
    println(newArr1) //ArrayBuffer(3, 2, 5, 15)

    // += 也可以直接添加
    //此方式添加 会返回一个新的数组 新数组 和 旧数组 保存的是用一个引用
    //不能额外加冒号
    val arr3 = arr1 += 100
    println(arr1)
    println(arr3)
    println(arr3 == arr1) //true

    //添加  最前追加 不能省略冒号
    val ret = 20 +=: arr1
    println("ret: " + ret )
    println(arr1 + "最前追加")
    println(ret == arr1) //一样返回一个数组 引用指向同一个地址

    //方法追加
    //末尾追加
    arr1.append(23)
    //最前追加
    arr1.prepend(12)
    //任意位置添加 在 1位置 添加元素 13 49
    arr1.insert(1, 12, 47)
    println(arr1)

    println("---添加一个数组----")
    //添加一个数组
    arr1.insertAll(2, arr3)
    println(arr1)

    //删除元素
    //删除指定位置的元素
    arr1.remove(3)
    //从0下标开始 连续删除4个数
    arr1.remove(0, 4)
    println(arr1)

    //按照元素删除 找到了删除 没找到什么都不做
    println(arr1)
    //可以连续删除多个 元素 并且 可以删除重复元素
    arr1 -= 100 -= 47 -= 3
    println(arr1)

    //可变转不可变
    val olad = arr1.toArray
    println(olad)

    //不可变转可变数组
    val arr10 = olad.toBuffer
    println(arr10)

    println(arr1(0))

    arr1(0) = 1000
    println(arr1)



  }

}
